import os
import tarfile
import shutil

def extract_tar_gz(source_dir, target_dir):
    # 确保目标目录存在
    if not os.path.exists(target_dir):
        os.makedirs(target_dir)
    
    # 遍历源目录中的所有文件
    for filename in os.listdir(source_dir):
        if filename.endswith('.tar.gz'):
            # 获取不带扩展名的文件名
            base_name = filename[:-7]
            target_path = os.path.join(target_dir, base_name)
            
            # 如果目标目录已存在，则跳过
            if os.path.exists(target_path):
                print(f"跳过 {filename}，目标目录已存在")
                continue
            
            # 创建临时解压目录
            temp_extract_dir = os.path.join(target_dir, 'temp_extract')
            if os.path.exists(temp_extract_dir):
                shutil.rmtree(temp_extract_dir)
            os.makedirs(temp_extract_dir)
            
            # 解压文件
            try:
                with tarfile.open(os.path.join(source_dir, filename), 'r:gz') as tar:
                    tar.extractall(temp_extract_dir)
                
                # 检查解压后的目录结构
                extract_contents = os.listdir(temp_extract_dir)
                
                # 如果只有一个目录且名称与压缩文件相同，则移动其内容
                if len(extract_contents) == 1:
                    inner_dir = os.path.join(temp_extract_dir, extract_contents[0])
                    if os.path.isdir(inner_dir) and extract_contents[0] == base_name:
                        # 移动内容到目标目录
                        os.makedirs(target_path)
                        for item in os.listdir(inner_dir):
                            shutil.move(
                                os.path.join(inner_dir, item),
                                os.path.join(target_path, item)
                            )
                        print(f"成功解压 {filename} 并调整目录结构")
                    else:
                        # 直接重命名目录
                        shutil.move(inner_dir, target_path)
                        print(f"成功解压 {filename}")
                else:
                    # 直接移动所有内容到目标目录
                    os.makedirs(target_path)
                    for item in extract_contents:
                        shutil.move(
                            os.path.join(temp_extract_dir, item),
                            os.path.join(target_path, item)
                        )
                    print(f"成功解压 {filename}")
                
            except Exception as e:
                print(f"解压 {filename} 时出错: {str(e)}")
            finally:
                # 清理临时目录
                if os.path.exists(temp_extract_dir):
                    shutil.rmtree(temp_extract_dir)

if __name__ == "__main__":
    source_directory = "/home/not0433/wks/gitee_clone/lss/tools_b2d/b2d_download/"
    target_directory = "/home/not0433/wks/gitee_clone/lss/tools_b2d/b2d_dataset/"
    
    extract_tar_gz(source_directory, target_directory)